package cn.blnp.net.flowable.task.service.execute;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * <h3>服务任务的可触发、异步执行与结果返回</h3>
 *
 * @author <a href="mailto:blnp.yibin@qq.com">lyb</a>
 * @version 1.0
 * @since 2025/5/13 10:58
 */
@Slf4j
@SpringBootTest
public class ServiceTaskExecuteTest {

    /**
     *  <p>
     *      当使用服务任务发送JMS消息或访问HTTP接口等方式调用外部服务时，流程实例会进入等待状态，直到外部服务回复响应后，流程实例才离开服务任务继续流转。这
     *  种场景通常可以使用服务任务和接收任务来实现，但是存在一种极端条件：外部服务的响应可能会早于流程实例持久化和接收任务激活，这种情况下就来不及对外部服务的
     *  响应做处理。为了解决这个问题，Flowable为服务任务增加了triggerable（可触发）属性，用于将服务任务转变为执行服务逻辑，并在继续执行之前等待外部的响应。
     *  如果在可触发的服务任务上同时设置async（异步）属性为true，则流程实例会先持久化，然后由异步作业来执行服务任务逻辑。
     *  <pre>
     *      {@code
     *          <serviceTask id="triggerableServiceTask" name="可触发服务任务" flowable:expression="#{myService.doSomething()}" flowable:triggerable="true" flowable:async="true" />
     *      }
     *  </pre>
     *  </p>
     *  <p>
     *      外部服务可以同步或异步地触发等待中的流程实例。为了避免乐观锁异常，建议使用异步触发，可以使用RuntimeService的triggerAsync()方法异步触发等待中的
     *  流程实例。当然，使用RuntimeService的trigger()方法同步触发也可以。
     *  </p>
     *  <p>
     *      配置为异步时，还可以通过配置failedJobRetryTimeCycle属性指定处理失败作业时的重试策略。它可以设置为一个ISO 8601标准时间表达式，用于定义重试作业的时间间隔。
     *  当服务任务执行失败时，Flowable会根据该属性的值进行重试，直到作业成功执行或达到最大重试次数。配置方式如下：
     *  <pre>
     *      {@code
     *          <serviceTask id="triggerableServiceTask" name="异步可重试服务任务" flowable:expression="#{myService.doSomething()}" flowable:async="true">
     *              <extensionElements>
     *                  <flowable:failedJobRetryTimeCycle>R5/PT10M</flowable:failedJobRetryTimeCycle>
     *              </extensionElements>
     *          </serviceTask>
     *      }
     *  </pre>
     *      在以上配置中，异步执行服务任务失败后会重试5次，每次间隔10分钟。
     *  </p>
     **/
    @Test
    public void testExecute() {

    }

    /**
     *  <p>
     *      对于使用表达式的服务任务，服务执行的返回值可以通过服务任务定义的flowable:resultVariable属性设置为流程变量，它可以是新的流程变量，也可以是已经存在的流程变量。如果指定为已存在
     *  的流程变量，则流程变量的值会被服务执行的结果覆盖。<b>如果不指定返回变量名，则服务任务的结果值将被忽略。</b>
     *  <pre>
     *      {@code
     *          <serviceTask id="expressionServiceTask" name="服务任务" flowable:expression="${businessBean.calculateMount()}" flowable:resultVariable="totalMount" />
     *      }
     *  </pre>
     *  </p>
     **/
    @Test
    public void testRes() {

    }
}
